/**
 * @file rscNet.h
 * @brief Racchiude le funzionalità per fornire le comunicazioni di rete.
 *
 * Vengono inserite le strutture per configurare e gestire le risorse di rete.
 *
 * @date Mar 27, 2012
 * @author Francesco Corvino
 */

#ifndef RSCNET_H_
#define RSCNET_H_

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

#include "../RscHost/session.h"
#include "connection.h"

#define UDP_MAX_SIZE_PKT 65000

#define KEY_NETINFO_STRING "net-info"

#define KEY_NETINFO_INT CMap_StringHash(KEY_NETINFO_STRING)

typedef struct NetOperation_ {
	int bytesReceived;
	int bytesSent;
	int typeProtocol;
	int nsequence;
} NetOperation;

typedef struct NetSession_ {
	DynArray operations;
} NetSession;

//////////////////////////////////////////////////////////////////////////////////////////
////// Funzioni per la gestione degli elementi in memoria ////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////

void RscNet_addOperation(HostSession * session, NetOperation * op);

//////////////////////////////////////////////////////////////////////////////////////////
////// Funzioni e strutture d'utilità per la gestione degli elementi di rete /////////////
//////////////////////////////////////////////////////////////////////////////////////////

typedef struct {
	char *address;
	unsigned int port;
	int family;
} PAddress;

void RscNet_init(HostSession * session);

void PAddress_init(Address * addr, PAddress * paddr);

void PAddress_initS(PAddress * a, char *name, char *port);

void PAddress_destory(PAddress *paddr);

//////////////////////////////////////////////////////////////////////////////////////////
////// Funzioni per la gestione delle comunicazioni UDP //////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////


typedef struct {
	int ai_family;// = AF_UNSPEC;
	bool isServer;// = false;
	bool isConnected;// = false;
	int recvFlag;// = 0;
} UDPConnection;

int UDP_getAddress(Address *addr,char *address,char *port);

int UDP_sendMsgTo(Connection *c, Address * to, char *msg);

int UDP_recvMsgFrom(Connection *c, char *bufin, int maxBufin, Address * from);

void UDP_createConn(Connection *c,UDPConnection *uc);

#endif /* RSCNET_H_ */
